package com.bdd.crowd.mvc.handler;

import com.bdd.crowd.constant.CrowdConstant;
import com.bdd.crowd.entity.Admin;
import com.bdd.crowd.service.api.AdminService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

/**
 * @author banddong
 * @create 2020-08-23 0:01
 * 用户管理
 */
@Controller
public class AdminHandler {

    /**
     * 注入service层
      */
    @Autowired
    private AdminService adminService;

    /**
     * 登录
     * @param loginAcct 用户名
     * @param userPswd 密码
     * @param session  用户名存入session
     * @return 重定向页面
     */
    @RequestMapping("admin/do/login.html")
    public String doLogin(@RequestParam("loginAcct") String loginAcct,
                          @RequestParam("userPswd") String userPswd,
                          HttpSession session){

        // 调用service层方法执行登陆检查
        // 如果能返回admin对象则证明登录成功，如果账号密码不正确会抛异常
        Admin admin = adminService.getAdminByloginAcct(loginAcct, userPswd);

        // 将登录成功返回的admin对象传入session
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN,admin);

        // 返回页面
        return "redirect:/admin/to/main.html";
    }


    /**
     * 退出
     * @param session
     * @return 重定向页面
     */
    @RequestMapping(value = "/admin/to/logout.html")
    public String logOut(HttpSession session){

        //強制session失效
        session.invalidate();

        return "redirect:/admin/to/login.html";
    }


    /**
     * 页面一览,分页显示
     * @param keyword  查询的参数
     * @param pageNum  开始数
     * @param pageSize 每页显示数
     * @param modelMap 传入modelmap模型
     * @return         返回的视图
     */
    @RequestMapping(value = "/admin/get/page.html")
    public String getPageInfo(
            @RequestParam(value = "keyword",defaultValue = "") String keyword,
            @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
            @RequestParam(value = "pageSize",defaultValue = "5") Integer pageSize,
            ModelMap modelMap){

        // 调用service方法获取PageHeloper
        PageInfo<Admin> pageInfo = adminService.pageInfo(keyword, pageNum, pageSize);

        // 将pageHelper对象存入模型
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO,pageInfo);

        return "admin-page";
    }

    // 删除

    @RequestMapping(value = "/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String removeAdminById(
                @PathVariable("adminId") Integer adminId,
                @PathVariable("pageNum") Integer pageNum,
                @PathVariable("keyword") String keyword,
                HttpSession session
            ){

        // 执行删除操作
        adminService.removeAdminById(adminId,session);

        // 页面跳转回到分页页面

        // 方案一：直接转发到admin-page.jsp会无法显示分页数据
        // return "admin-page";

        // 方案二：转发到 /admin/get/page.html地址，一旦刷新将会重复删除操作浪费性能
        // return "forward:/admin/get/page.html";

        // 方案三：重定向搭配/admin/get/page.html地址
        // 同时为了保持所在的页面和查询关键字再附加pageNum和keyword两个请求参数
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }

    /**
     * 新增
     * @param admin
     * @return
     */
    @RequestMapping(value = "/admin/do/insertAdmin.html")
    public String insertAdmin(Admin admin){

        // 执行新增操作
        adminService.insertAdmin(admin);

        return "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;
    }

    /**
     * 修改前处理
     * @param adminId
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/to/edit/page.html")
    public String toEditPage(@RequestParam("adminId") Integer adminId,ModelMap modelMap){

        // 1.根据adminId查询Admin对象
        Admin admin = adminService.getAdminByAdminId(adminId);
        // 2.将Admin对象存入模型
        modelMap.addAttribute("admin", admin);
        return "add-edit";
    }

    /**
     * 修改
     * @param admin
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/admin/do/updateAdmin.html")
    public String updateAdmin(Admin admin, @RequestParam("pageNum") Integer pageNum, @RequestParam("keyword") Integer keyword){

        // 执行更新操作
        adminService.updateAdmin(admin);

        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }

































}
